From: Keir Fraser Date: Wed, 23 Apr 2008 13:17:35 +0000 (+0100) Subject: Drop characters if an asynchronous serial tx buffer fills up. X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~14215^2~133 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/%22/%22http:/www.example.com/cgi/%22?a=commitdiff_plain;h=989cfc3a3ab54cc5841cf18004f82451933dfb21;p=xen.git Drop characters if an asynchronous serial tx buffer fills up. Signed-off-by: Keir Fraser --- diff --git a/xen/drivers/char/serial.c b/xen/drivers/char/serial.c index cf2df9b3df..34c188c641 100644 --- a/xen/drivers/char/serial.c +++ b/xen/drivers/char/serial.c @@ -15,6 +15,9 @@ #include #include +/* Never drop characters, even if the async transmit buffer fills. */ +/* #define SERIAL_NEVER_DROP_CHARS 1 */ + unsigned int serial_txbufsz = 16384; static void __init parse_serial_tx_buffer(const char *s) { @@ -91,22 +94,24 @@ void serial_tx_interrupt(struct serial_port *port, struct cpu_user_regs *regs) static void __serial_putc(struct serial_port *port, char c) { - int i; - if ( (port->txbuf != NULL) && !port->sync ) { /* Interrupt-driven (asynchronous) transmitter. */ +#ifdef SERIAL_NEVER_DROP_CHARS if ( (port->txbufp - port->txbufc) == serial_txbufsz ) { - /* Buffer is full: we spin, but could alternatively drop chars. */ + /* Buffer is full: we spin waiting for space to appear. */ + int i; while ( !port->driver->tx_empty(port) ) cpu_relax(); for ( i = 0; i < port->tx_fifo_size; i++ ) port->driver->putc( port, port->txbuf[mask_serial_txbuf_idx(port->txbufc++)]); port->txbuf[mask_serial_txbuf_idx(port->txbufp++)] = c; + return; } - else if ( ((port->txbufp - port->txbufc) == 0) && +#endif + if ( ((port->txbufp - port->txbufc) == 0) && port->driver->tx_empty(port) ) { /* Buffer and UART FIFO are both empty. */